import { Type } from 'class-transformer';
import {
  IsNotEmpty,
  MinLength,
  MaxLength,
  IsOptional,
  IsPositive,
  IsPhoneNumber,
  IsEmail,
  IsNumberString,
  IsEnum,
  IsDate,
  IsIP,
} from 'class-validator';
import { GenderType } from 'src/common/type/gender.type';
import {
  EmployeeDisabledType,
  EmployeeLockType,
  EmployeeLoginFirstType,
  EmployeeStatusType,
} from '../type/employee.status.type';

// 新增验证
export class EmployeeInsertDto {
  // 账号
  @Type(() => String)
  @IsNotEmpty({ message: '账号不能为空' })
  @MinLength(3, { message: '账号长度最少为 $constraint1 ,但实际为 $value' })
  @MaxLength(255, { message: '账号长度最长为 $constraint1' })
  account: string;

  // 姓名
  @IsOptional()
  @Type(() => String)
  @IsNotEmpty({ message: '姓名不能为空' })
  @MinLength(3, { message: '姓名长度最少为 $constraint1 ,但实际为 $value' })
  @MaxLength(255, { message: '姓名长度最长为 $constraint1' })
  name: string;

  // 密码
  @Type(() => String)
  @IsNotEmpty({ message: '密码不能为空' })
  @MinLength(5, { message: '密码长度最少为 $constraint1 ,但实际为 $value' })
  @MaxLength(255, { message: '密码长度最长为 $constraint1' })
  password: string;

  // 头像
  @IsOptional()
  @Type(() => String)
  @IsNotEmpty({ message: '头像不能为空' })
  @MinLength(1, { message: '头像地址长度最少为 $constraint1 ,但实际为 $value' })
  @MaxLength(255, { message: '头像地址长度最长为 $constraint1' })
  avatar: string;

  // 手机号码
  @IsOptional()
  @Type(() => String)
  @IsNotEmpty({ message: '手机号码不能为空' })
  @IsPhoneNumber('CH', { message: '不是有效的手机号码' })
  phone: string;

  // 邮箱
  @IsOptional()
  @Type(() => String)
  @IsNotEmpty({ message: '邮箱不能为空' })
  @IsEmail()
  email: string;

  // 年龄
  @IsOptional()
  @Type(() => Number)
  @IsNotEmpty({ message: '年龄不能为空' })
  @IsPositive({ message: '年龄需要为正整数' })
  age: number;

  // 性别
  @IsOptional()
  @Type(() => Number)
  @IsNotEmpty({ message: '性别不能为空' })
  @IsEnum(GenderType)
  gender: number;

  // 区域id
  @IsOptional()
  @Type(() => String)
  @IsNumberString()
  area: string;

  // 账号状态
  @IsOptional()
  @Type(() => Number)
  @IsEnum(EmployeeStatusType)
  status: number;

  // 激活时间
  @IsOptional()
  @IsDate({ message: '激活时间应为日期类型' })
  activate_time: Date;

  // 是否第一次登录
  @IsOptional()
  @Type(() => Number)
  @IsEnum(EmployeeLoginFirstType)
  is_first_login: number;

  // 是否锁定
  @IsOptional()
  @Type(() => Number)
  @IsEnum(EmployeeLockType)
  is_locked: number;

  // 锁定时间
  @IsOptional()
  @IsDate({ message: '锁定时间应为日期类型' })
  locked_time: Date;

  // 是否禁用
  @IsOptional()
  @Type(() => Number)
  @IsEnum(EmployeeDisabledType)
  is_disabled: number;

  // 禁用时间
  @IsOptional()
  @IsDate({ message: '禁用时间应为日期类型' })
  disabled_time: Date;

  // 最后一次登录的ip
  @IsOptional()
  @Type(() => String)
  @IsIP()
  last_login_ip: string;

  // 最后一次登录的时间
  @IsOptional()
  @IsDate({ message: '最后一次登录的时间应为日期类型' })
  last_login_time: Date;

  // 最后一次更新密码的时间
  @IsOptional()
  @IsDate({ message: '最后一次更新密码的时间应为日期类型' })
  last_update_password_time: Date;

  // 创建时间
  @IsOptional()
  @IsDate({ message: '创建时间应为日期类型' })
  create_time: Date;

  // 部门
  @IsOptional()
  @Type(() => String)
  @MinLength(1, { message: '部门长度最少为 $constraint1 ,但实际为 $value' })
  @MaxLength(255, { message: '部门长度最长为 $constraint1' })
  department: string;

  // 公司
  @IsOptional()
  @Type(() => String)
  @MinLength(1, { message: '公司长度最少为 $constraint1 ,但实际为 $value' })
  @MaxLength(255, { message: '公司长度最长为 $constraint1' })
  firm: string;

  // 描述
  @IsOptional()
  @Type(() => String)
  @MinLength(1, { message: '描述长度最少为 $constraint1 ,但实际为 $value' })
  @MaxLength(255, { message: '描述长度最长为 $constraint1' })
  description: string;
}
